package com.hy.video.monitor.service.impl;

import com.hy.video.monitor.conf.DynamicTask;
import com.hy.video.monitor.gb28181.bean.Device;
import com.hy.video.monitor.gb28181.transmit.cmd.ISIPCommander;
import com.hy.video.monitor.service.IDeviceService;
import com.hy.video.monitor.service.bean.CatalogSubscribeTask;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 设备业务（目录订阅）
 * 联网系统间采用订阅通知机制实现状态变化的设备信息的传送,用于提供联网系统间设备状态一致
 * 性的维护机制。SIP域可通过订阅方式订阅其他SIP域的全部或部分目录的离线、上线、增加、删除、更新
 * 等变更信息;被订阅域在目录变更后,应将变更事件通知订阅域。订阅通知消息使用IETFRFC3265规定
 * 的SUBSCRIBE、NOTIFY方法实现。
 * 某一SIP域可进行其他多个SIP域目录信息的订阅,也可接受其他多个 SIP域的订阅。本域保存
 * 订阅目录、被订阅目录列表,在本域被订阅目录变更后向订阅域发送通知消息,订阅域接收到通知消息
 * 后进行相应更新处理。
 *
 * A 域在初始订阅成功之后,应在过期之前向 B域发送刷新订阅消息,进行订阅状态维护。
 * 刷新订阅消息与初始订阅消息属于同一会话,并且 Expire头域值大于0。
 */
@Service
public class DeviceServiceImpl implements IDeviceService {

    private final static Logger logger = LoggerFactory.getLogger(DeviceServiceImpl.class);

    @Autowired
    private DynamicTask dynamicTask;
;

    @Autowired
    private ISIPCommander sipCommander;

    @Override
    public boolean addCatalogSubscribe(Device device) {
        if (device == null || device.getSubscribeCycleForCatalog() < 0) {
            return false;
        }
        if (dynamicTask.contains(device.getDeviceId())) {// 判断指定任务是否存在
            logger.info("[添加目录订阅] 设备{}的目录订阅以存在", device.getDeviceId());
            return false;
        }
        logger.info("[添加目录订阅] 设备{}", device.getDeviceId());
        // 添加目录订阅：多线程+定时任务
        CatalogSubscribeTask catalogSubscribeTask = new CatalogSubscribeTask(device, sipCommander);
        // 开启线程
        catalogSubscribeTask.run();
        // 提前开始刷新订阅
        int subscribeCycleForCatalog = device.getSubscribeCycleForCatalog();
        // 设置最小值为30
        subscribeCycleForCatalog = Math.max(subscribeCycleForCatalog, 30);
        // 开启定时任务：定时开启catalogSubscribeTask线程
        dynamicTask.startCron(device.getDeviceId(), catalogSubscribeTask, subscribeCycleForCatalog - 5);
        return true;
    }

    @Override
    public boolean removeCatalogSubscribe(Device device) {
        if (device == null || device.getSubscribeCycleForCatalog() < 0) {
            return false;
        }
        logger.info("移除目录订阅: {}", device.getDeviceId());
        dynamicTask.stop(device.getDeviceId());
        device.setSubscribeCycleForCatalog(0);
        sipCommander.catalogSubscribe(device, null, null);
        // 清空cseq计数

        return true;
    }
}
